Micron Document
🎖️GitЯра🎖️

Node / meshcore / MeshCore / files / src / helpers / stm32 / InternalFileSystem.cpp

Displaying Raw • Download

src/helpers/stm32/InternalFileSystem.cpp 93b2db63de9009af047a2d0e1bcd97b4b0ba7106 (93b2db63) Text, 5.12 KB

T8b949e/*
* The MIT License (MIT)
*
* Copyright (c) 2019 hathach for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
Tff7b72#Tff7b72include T8b949e<Arduino.h>
Tff7b72#Tff7b72include T8b949e"InternalFileSystem.h"

T8b949e//--------------------------------------------------------------------+
T8b949e// LFS Disk IO
T8b949e//--------------------------------------------------------------------+
Tff7b72static Tffa657int Td2a8ff_internal_flash_readTb4b4b4(Tff7b72const Tff7b72struct T56d364lfs_config Tff7b72*Te6edf3cTb4b4b4, Te6edf3lfs_block_t Te6edf3blockTb4b4b4, Te6edf3lfs_off_t Te6edf3offTb4b4b4, Tffa657void Tff7b72*Te6edf3bufferTb4b4b4, Te6edf3lfs_size_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3buffer Tff7b72|Tff7b72| Tff7b72!Te6edf3sizeTb4b4b4) Tff7b72return Te6edf3LFS_ERR_INVALTb4b4b4;
Te6edf3lfs_block_t Te6edf3address Tff7b72= Te6edf3LFS_FLASH_ADDR_BASE Tff7b72+ Tb4b4b4(Te6edf3block Tff7b72* Te6edf3FLASH_PAGE_SIZE Tff7b72+ Te6edf3offTb4b4b4)Tb4b4b4;
Te6edf3memcpyTb4b4b4(Te6edf3bufferTb4b4b4, Tb4b4b4(Tffa657void Tff7b72*Tb4b4b4)Te6edf3addressTb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3LFS_ERR_OKTb4b4b4;
Tb4b4b4}

T8b949e// Program a region in a block. The block must have previously
T8b949e// been erased. Negative error codes are propagated to the user.
T8b949e// May return LFS_ERR_CORRUPT if the block should be considered bad.
Tff7b72static Tffa657int Td2a8ff_internal_flash_progTb4b4b4(Tff7b72const Tff7b72struct T56d364lfs_config Tff7b72*Te6edf3cTb4b4b4, Te6edf3lfs_block_t Te6edf3blockTb4b4b4, Te6edf3lfs_off_t Te6edf3offTb4b4b4, Tff7b72const Tffa657void Tff7b72*Te6edf3bufferTb4b4b4, Te6edf3lfs_size_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
Te6edf3HAL_StatusTypeDef Te6edf3hal_rc Tff7b72= Te6edf3HAL_OKTb4b4b4;
Te6edf3lfs_block_t Te6edf3addr Tff7b72= Te6edf3LFS_FLASH_ADDR_BASE Tff7b72+ Tb4b4b4(Te6edf3block Tff7b72* Te6edf3FLASH_PAGE_SIZE Tff7b72+ Te6edf3offTb4b4b4)Tb4b4b4;
Tffa657uint64_t Tff7b72*Te6edf3bufp Tff7b72= Tb4b4b4(Tffa657uint64_t Tff7b72*Tb4b4b4) Te6edf3bufferTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3HAL_FLASH_UnlockTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= Te6edf3HAL_OKTb4b4b4) Tff7b72return Te6edf3LFS_ERR_IOTb4b4b4;
Tff7b72for Tb4b4b4(Tffa657uint32_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3sizeTff7b72/T79c0ff8Tb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3addr Tff7b72< Te6edf3LFS_FLASH_ADDR_BASETb4b4b4) Tff7b72|Tff7b72| Tb4b4b4(Te6edf3addr Tff7b72> Te6edf3FLASH_END_ADDRTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3HAL_FLASH_LockTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3LFS_ERR_INVALTb4b4b4;
Tb4b4b4}
Te6edf3hal_rc Tff7b72= Te6edf3HAL_FLASH_ProgramTb4b4b4(Te6edf3FLASH_TYPEPROGRAM_DOUBLEWORDTb4b4b4, Te6edf3addrTb4b4b4, Tff7b72*Te6edf3bufpTb4b4b4)Tb4b4b4;
Te6edf3addr Tff7b72+Tff7b72= T79c0ff8Tb4b4b4;
Te6edf3bufp Tff7b72+Tff7b72= T79c0ff1Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3HAL_FLASH_LockTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= Te6edf3HAL_OKTb4b4b4) Tff7b72return Te6edf3LFS_ERR_IOTb4b4b4;
Tff7b72return Te6edf3hal_rc Tff7b72=Tff7b72= Te6edf3HAL_OK Tff7b72? Te6edf3LFS_ERR_OK Tff7b72: Te6edf3LFS_ERR_IOTb4b4b4;
Tb4b4b4}

T8b949e// Erase a block. A block must be erased before being programmed.
T8b949e// The state of an erased block is undefined. Negative error codes
T8b949e// are propagated to the user.
T8b949e// May return LFS_ERR_CORRUPT if the block should be considered bad.
Tff7b72static Tffa657int Td2a8ff_internal_flash_eraseTb4b4b4(Tff7b72const Tff7b72struct T56d364lfs_config Tff7b72*Te6edf3cTb4b4b4, Te6edf3lfs_block_t Te6edf3blockTb4b4b4)
Tb4b4b4{
Te6edf3HAL_StatusTypeDef Te6edf3hal_rcTb4b4b4;
Te6edf3lfs_block_t Te6edf3address Tff7b72= Te6edf3LFS_FLASH_ADDR_BASE Tff7b72+ Tb4b4b4(Te6edf3block Tff7b72* Te6edf3FLASH_PAGE_SIZETb4b4b4)Tb4b4b4;
Tffa657uint32_t Te6edf3pageError Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3FLASH_EraseInitTypeDef Te6edf3EraseInitStruct Tff7b72= Tb4b4b4{
Tb4b4b4.Te6edf3TypeErase Tff7b72= Te6edf3FLASH_TYPEERASE_PAGESTb4b4b4,
Tb4b4b4.Te6edf3Page Tff7b72= T79c0ff0Tb4b4b4,
Tb4b4b4.Te6edf3NbPages Tff7b72= T79c0ff1
Tb4b4b4}Tb4b4b4;
Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3address Tff7b72< Te6edf3LFS_FLASH_ADDR_BASETb4b4b4) Tff7b72|Tff7b72| Tb4b4b4(Te6edf3address Tff7b72> Te6edf3FLASH_END_ADDRTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3LFS_ERR_INVALTb4b4b4;
Tb4b4b4}
Te6edf3EraseInitStructTb4b4b4.Te6edf3Page Tff7b72= Tb4b4b4(Te6edf3address Tff7b72- Te6edf3FLASH_BASETb4b4b4) Tff7b72/ Te6edf3FLASH_PAGE_SIZETb4b4b4;
Te6edf3HAL_FLASH_UnlockTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3hal_rc Tff7b72= Te6edf3HAL_FLASHEx_EraseTb4b4b4(Tff7b72&Te6edf3EraseInitStructTb4b4b4, Tff7b72&Te6edf3pageErrorTb4b4b4)Tb4b4b4;
Te6edf3HAL_FLASH_LockTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72return Te6edf3hal_rc Tff7b72=Tff7b72= Te6edf3HAL_OK Tff7b72? Te6edf3LFS_ERR_OK Tff7b72: Te6edf3LFS_ERR_IOTb4b4b4;
Tb4b4b4}

T8b949e// Sync the state of the underlying block device. Negative error codes
T8b949e// are propagated to the user.
Tff7b72static Tffa657int Td2a8ff_internal_flash_syncTb4b4b4(Tff7b72const Tff7b72struct T56d364lfs_config Tff7b72*Te6edf3cTb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3LFS_ERR_OKTb4b4b4; T8b949e// don't need sync
Tb4b4b4}

Tff7b72struct T56d364lfs_config Te6edf3_InternalFSConfig Tff7b72= Tb4b4b4{
Tb4b4b4.Te6edf3context Tff7b72= Tffa657NULLTb4b4b4,
Tb4b4b4.Te6edf3read Tff7b72= Te6edf3_internal_flash_readTb4b4b4,
Tb4b4b4.Te6edf3prog Tff7b72= Te6edf3_internal_flash_progTb4b4b4,
Tb4b4b4.Te6edf3erase Tff7b72= Te6edf3_internal_flash_eraseTb4b4b4,
Tb4b4b4.Te6edf3sync Tff7b72= Te6edf3_internal_flash_syncTb4b4b4,

Tb4b4b4.Te6edf3read_size Tff7b72= Te6edf3LFS_BLOCK_SIZETb4b4b4,
Tb4b4b4.Te6edf3prog_size Tff7b72= Te6edf3LFS_BLOCK_SIZETb4b4b4,
Tb4b4b4.Te6edf3block_size Tff7b72= Te6edf3LFS_BLOCK_SIZETb4b4b4,
Tb4b4b4.Te6edf3block_count Tff7b72= Te6edf3LFS_FLASH_TOTAL_SIZE Tff7b72/ Te6edf3LFS_BLOCK_SIZETb4b4b4,
Tb4b4b4.Te6edf3lookahead Tff7b72= T79c0ff128Tb4b4b4,

Tb4b4b4.Te6edf3read_buffer Tff7b72= Tffa657NULLTb4b4b4,
Tb4b4b4.Te6edf3prog_buffer Tff7b72= Tffa657NULLTb4b4b4,
Tb4b4b4.Te6edf3lookahead_buffer Tff7b72= Tffa657NULLTb4b4b4,
Tb4b4b4.Te6edf3file_buffer Tff7b72= Tffa657NULL
Tb4b4b4}Tb4b4b4;

Te6edf3InternalFileSystem Te6edf3InternalFSTb4b4b4;

T8b949e//--------------------------------------------------------------------+
T8b949e//
T8b949e//--------------------------------------------------------------------+

Te6edf3InternalFileSystemTff7b72:Tff7b72:Te6edf3InternalFileSystemTb4b4b4(Tffa657voidTb4b4b4)
Tff7b72: Te6edf3Adafruit_LittleFSTb4b4b4(Tff7b72&Te6edf3_InternalFSConfigTb4b4b4)
Tb4b4b4{

Tb4b4b4}

Tffa657bool Te6edf3InternalFileSystemTff7b72:Tff7b72:Te6edf3beginTb4b4b4(Tffa657voidTb4b4b4)
Tb4b4b4{
Tff7b72volatile Tffa657bool Te6edf3format_fsTb4b4b4;
Tff7b72#Tff7b72ifdef FORMAT_FS
Te6edf3format_fs Tff7b72= Tffa657trueTb4b4b4;
Tff7b72#Tff7b72else
Te6edf3format_fs Tff7b72= Tffa657falseTb4b4b4; T8b949e// you can always use debugger to force formatting ;)
Tff7b72#Tff7b72endif
T8b949e// failed to mount, erase all sector then format and mount again
Tff7b72if Tb4b4b4( Te6edf3format_fs Tff7b72|Tff7b72| Tff7b72!Te6edf3Adafruit_LittleFSTff7b72:Tff7b72:Te6edf3beginTb4b4b4(Tb4b4b4) Tb4b4b4)
Tb4b4b4{
T8b949e// lfs format
Tff7b72thisTff7b72-Tff7b72>Te6edf3formatTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// mount again if still failed, give up
Tff7b72if Tb4b4b4( Tff7b72!Te6edf3Adafruit_LittleFSTff7b72:Tff7b72:Te6edf3beginTb4b4b4(Tb4b4b4) Tb4b4b4) Tff7b72return Tffa657falseTb4b4b4;
Tb4b4b4}

Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4}

Served by rngit 1.5.2 - Generated in 0.07s